import lodash from 'lodash';
import {
    convertSecToMinAndSec,
    createAGroupFolder,
    getCurrentDate,
    getGroupPlayerList,
    getPlayerData,
    isGroupExist,
    isPlayerExist,
    readConfiguration,
    storagePlayerData,
    timestampToSeconds
} from '../function/function.js';

export class Bs extends plugin {
    constructor() {
        super({
            name: '[Bs]抢面包',
            dsc: '抢面包',
            event: 'message',
            priority: 1,
            rule: [
                { reg: /^[#\/]抢.*/, fnc: 'rob' }
            ]
        })
    }

    async rob(e) {
        // 非群无法游玩
        if (!e.isGroup) return e.reply(['该游戏只能在群内使用'])
        // 判断是否@机器人
        if (e.atme) return e.reply(['不能抢劫机器人哦~'])
        /** ID [群, 用户, 指定用户] */
        const ID = [e.group_id, e.user_id, e.at]
        // 判断执行条件 [用户与指定用户为同一人]
        if (ID[1] === ID[2]) return e.reply(['无法抢自己哦~'])
        /** 用户输入内容 */
        const USER_INPUT_CONTENT = e.msg.replace(/#|\/|抢/g, '')
        /** 配置数据 */
        const configData = await readConfiguration()
        /** 默认物品 */
        let defaultItem = configData['bread_thing']
        /** 自定义物品 */
        const CUSTOM_ITEMS = configData['special_thing_group'][ID[0]]

        // 判断执行条件 [不存在指定用户 同时 抢面包操作必须指定用户]
        if (!ID[2] && !configData['is_random_robbed']) return e.reply(['您还没有@要抢的玩家呢'])
        // 判断执行条件 [不存在自定义物品 同时 用户输入内容不为默认物品] 或者 [存在自定义物品 同时 用户输入内容不为自定义物品]
        if (!CUSTOM_ITEMS && USER_INPUT_CONTENT !== defaultItem || CUSTOM_ITEMS && USER_INPUT_CONTENT !== CUSTOM_ITEMS) return false
        // 存在自定义物品 默认物品修改为自定义物品
        if (CUSTOM_ITEMS) {
            defaultItem = CUSTOM_ITEMS
        }

        // 判断是否有此群文件夹，没有则创建
        if (!isGroupExist(ID[0])) { createAGroupFolder(ID[0]) }

        // 判断是否存在该用户，没有则创建基础信息
        if (!isPlayerExist(ID[0], ID[1])) {
            storagePlayerData(ID[0], ID[1], {
                name: e.sender.card || '未设置面包昵称',
                lv: 0,
                xp: 0,
                number: 0,
                cd: { buy: 0, eat: 0, rob: 0, give: 0, bet: 0 },
                log: { buy: [], eat: [], rob: [], give: [], bet: [] }
            })
        }

        /** 用户数据 */
        const USER_DATA = await getPlayerData(ID[0], ID[1])
        /** 用户面包数量 */
        const USER_NUMBER = USER_DATA['number']
        /** 当前秒 */
        const CURRENT_SECOND = timestampToSeconds(Date.now())
        /** 剩余CD */
        const REMAINING_TIME = CURRENT_SECOND - USER_DATA['cd']['rob']

        // 若剩余CD为负数，则CD还未结束，返回提示
        if (REMAINING_TIME < 0) {
            const { minutes, remainingSeconds } = convertSecToMinAndSec(Math.abs(REMAINING_TIME))
            if (minutes > 0) {
                return e.reply([`无法抢${defaultItem}，还有${minutes}分${remainingSeconds}秒`])
            } else {
                return e.reply([`无法抢${defaultItem}，还有${remainingSeconds}秒`])
            }
        }

        /** 抢到的面包数量 */
        let robNumber = lodash.random(configData['min_rob'], configData['max_rob'])

        /** 被抢玩家数据 */
        let robUserData;

        // 判断是否指定玩家
        if (ID[2]) {
            // 判断是否存在该玩家
            if (!isPlayerExist(ID[0], ID[2])) return e.reply([`该玩家没有${defaultItem}可以抢呢~`])

            /** 该玩家数据 */
            const USER_2_DATA = await getPlayerData(ID[0], ID[2])

            // 判断该玩家面包数量是否足够抢
            if (USER_2_DATA['number'] < robNumber) return e.reply([`该玩家没有那么多${defaultItem}可以抢呢~`])

            // 写入
            robUserData = USER_2_DATA
        } else { // 不指定玩家随机抢
            /** 该群的玩家列表 */
            const GROUP_USER_LIST = getGroupPlayerList(ID[0])
            /** 可抢玩家列表 */
            let sureRobList = []

            // 循环写入可抢玩家ID
            for (let i = 0; i < GROUP_USER_LIST.length; i++) {
                /** 被抢玩家ID */
                const USER_ID = GROUP_USER_LIST[i].replace(/.json/g, '')
                /** 被抢玩家数据 */
                const USER_2_DATA = await getPlayerData(ID[0], USER_ID)
                // 判断玩家面包是否可抢
                if (USER_2_DATA['number'] >= robNumber) {
                    // 写入该玩家
                    sureRobList.push(USER_ID)
                }
            }
            // 从可抢玩家列表中删除自己
            sureRobList = sureRobList.filter(item => item !== `${ID[1]}`)

            if (sureRobList.length === 0) return e.reply([`该群玩家的${defaultItem}都太少啦，无法抢${defaultItem}，快叫他们买点吧！`])

            /** 从可抢玩家列表随机一个玩家 */
            let randomUser = lodash.random(0, sureRobList.length - 1)
            /** 该玩家数据 */
            const USER_2_DATA = await getPlayerData(ID[0], sureRobList[randomUser])

            // 写入
            robUserData = USER_2_DATA
            ID[2] = sureRobList[randomUser]
        }

        /** 返回消息 */
        let msg = `成功抢了[${robUserData['name']}]${robNumber}个${defaultItem}，你现在拥有${USER_NUMBER + robNumber}个${defaultItem}！`

        /** 1~0 之间的随机数 */
        const RANDOM_NUMBER = Math.random();
        /** 随机事件 */
        if (RANDOM_NUMBER < 0.05) {
            /** [1, 2, 3] 之间的随机数 */
            const RANDOM = lodash.random(1, 3)
            if (RANDOM === 1) { // 执行条件 RANDOM为1
                if (USER_NUMBER > robNumber) { // 执行条件 拥有面包数量大于抢得面包数量
                    msg = `你抢${defaultItem}被我抓住了！你真的太坏了！我要罚你${robNumber}个${defaultItem}！`
                    robNumber = -robNumber
                }
            } else if (RANDOM === 2) { // 执行条件 RANDOM为2
                if (robUserData['number'] > robNumber * 2) { // 执行条件 被抢玩家面包数量大于抢得面包数量的两倍
                    msg = `抢劫大成功！抢了[${robUserData['name']}]${robNumber * 2}个${defaultItem}！`
                    robNumber *= 2
                }
            } else { // 执行条件 RANDOM不为1或2
                msg = `太饿了！什么都没抢到，但是你想吃东西！吃${defaultItem}冷却刷新！`
                robNumber = 0
                USER_DATA['cd']['eat'] = 0
            }
        } else if (RANDOM_NUMBER < 0.07) {
            msg = `你抢${defaultItem}被警察抓住了！你真的太坏了！下次抢${defaultItem}时间多等40分钟！`
            robNumber = 0
            configData['cd_rob'] += 2400
        } else if (RANDOM_NUMBER < 0.09) {
            msg = `抢${defaultItem}失败啦！被[${robUserData['name']}]反击，你丢失${robNumber}个${defaultItem}！`
            robNumber = -robNumber
        } else if (RANDOM_NUMBER < 0.1) {
            msg += `有点上瘾，你想再抢一次！`
            configData['cd_rob'] = 0
        }

        // 用户数据处理 & 存储
        USER_DATA['cd']['rob'] = CURRENT_SECOND + configData['cd_rob']
        USER_DATA['log']['rob'].push(`[${getCurrentDate()}] 抢了${robUserData['name']}${robNumber}个${defaultItem}`)
        USER_DATA['number'] += robNumber
        storagePlayerData(ID[0], ID[1], USER_DATA)
        // 被抢用户数据处理 &存储
        robUserData['number'] -= robNumber
        storagePlayerData(ID[0], ID[2], robUserData)

        // 返回抢面包结果
        return e.reply([msg])
    }
}